// package com.qh.xx.test;
//
// /**
//  * @description:
//  * @author: zqh
//  * @date: 2021/11/8 23:53
//  **/
// public class Slb<E> {
//     private int size;
//     private Node<E> first;
//     private Node<E> last;
//
//     private static class Node<E> {
//         private E element;
//         private Node<E> prev;
//         private Node<E> next;
//
//         public Node(E element, Node<E> prev, Node<E> next) {
//             this.element = element;
//             this.prev = prev;
//             this.next = next;
//         }
//         @Override
//         public String toString() {
//             StringBuilder sb = new StringBuilder();
//
//             if (prev != null) {
//                 sb.append(prev.element);
//             } else {
//                 sb.append("null");
//             }
//
//             sb.append("_").append(element).append("_");
//
//             if (next != null) {
//                 sb.append(next.element);
//             } else {
//                 sb.append("null");
//             }
//
//             return sb.toString();
//         }
//     }
//
//     public int size() {
//         return size;
//     }
//
//     public void clear() {
//         size = 0;
//         first = null;
//         last = null;
//     }
//
//     public boolean isEmpty() {
//         return size == 0;
//     }
//
//     public E get(int index) {
//         return node(index).element;
//     }
//
//     public E set(int index, E element) {
//         Node<E> node = node(index);
//         E old = node.element;
//         node.element = element;
//         return old;
//     }
//
//     public void add(E element) {
//         add(size, element);
//     }
//
//     public void add(int index, E element) {
//         rangeCheckForAdd(index);
//         if (index == 0){
//             first = new Node<E>(element, null);
//         } else {
//             Node<E> prev = node(index - 1);
//             prev.next = new Node<>(element, prev.next);
//         }
//         size++;
//     }
//
//     public E remove(int index) {
//         rangeCheck(index);
//         Node<E> node = first;
//         if (size == 0){
//             first = first.next;
//         } else {
//             Node<E> prev = node(index - 1);
//             node = prev.next;
//             prev.next = node.next;
//         }
//         size--;
//         return node.element;
//     }
//
//     public E remove(E element) {
//         Node<E> node = first;
//         int index = indexOf(element);
//         if (size == 0){
//             first = first.next;
//         } else {
//             Node<E> prev = node(index - 1);
//             node = prev.next;
//             prev.next = node.next;
//         }
//         size--;
//         return node.element;
//     }
//
//     /**
//      * 根据element 获取索引位置
//      * @param element
//      * @return
//      */
//     public int indexOf(E element) {
//         if (element == null){
//             Node<E> node = first;
//             for (int i = 0; i < size; i++) {
//                 if (node.element == null){
//                     return i;
//                 }
//                 node = node.next;
//             }
//         } else {
//             Node<E> node = first;
//             for (int i = 0; i < size; i++) {
//                 if (element.equals(node.element)) {
//                     return i;
//                 }
//                 node = node.next;
//             }
//         }
//         return -1;
//     }
//
//     /**
//      * 根据index 获取 node
//      *
//      * @param index
//      * @return
//      */
//     private Node<E> node(int index) {
//         rangeCheck(index);
//         Node<E> node = first;
//         for (int i = 0; i < index; i++) {
//             node = node.next;
//         }
//         return node;
//     }
//
//     private void outOfBounds(int index) {
//         throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size);
//     }
//
//     private void rangeCheck(int index) {
//         if (index < 0 || index >= size) {
//             outOfBounds(index);
//         }
//     }
//
//     private void rangeCheckForAdd(int index) {
//         if (index < 0 || index > size) {
//             outOfBounds(index);
//         }
//     }
//
//     @Override
//     public String toString() {
//         StringBuilder string = new StringBuilder();
//         string.append("size=").append(size).append(", [");
//         Node<E> node = first;
//         for (int i = 0; i < size; i++) {
//             if (i != 0) {
//                 string.append(", ");
//             }
//             string.append(node);
//             node = node.next;
//         }
//         string.append("]");
//
//         // Node<E> node1 = first;
//         // while (node1 != null){
//         //
//         //
//         //     node1 = node1.next;
//         // }
//         return string.toString();
//     }
// }
